/*
 * Archivo.h
 *
 *  Created on: Sep 11, 2012
 *      Author: romina
 */

#ifndef ARCHIVOSMANAGER_H_
#define ARCHIVOSMANAGER_H_

#include <fstream>
#include <iostream>
#include <sys/stat.h>
#include <string.h>
#include <exception>

using namespace std;

namespace archivos {

enum MODOAPERTURA {R, W, RW};


class FaltaElModoDeAperturaException: public exception
{
  virtual const char* what() const throw()
  {
    return "No se pudo abrir el archivo porque no se establecio el modo.";
  }
};


class ArchivoBase{
protected:
	std::fstream archivo;
	string path;
	string filename;
	int cursor;
public:
	ArchivoBase();
	//abre el archivo
	//si no puede arroja una excepcion
	ArchivoBase(string path);
	//devuelve el path del archivo
	string getPath();
	//cierra el archivo
	virtual ~ArchivoBase();
	//obtiene una linea y posiciona el cursor
	//en la linea siguiente
	string obtenerLinea();
	string obtenerLineaHastaBarra();
	string obtenerPalabra();
	//escribe una palabra donde este el cursor
	void escribirPalabra(string palabra);
	//escribe una linea el cursor queda en la
	//linea siguiente
	void escribirLinea(string linea);
	//se posiciona al principio
	void ir_al_principio();
	//llego al fin
	bool is_EOF();

	string leer(int desde, int tamanio);

	int tamanio();

	int getchar();

//	string getBloque(int numero);

	void set_ancho(int ancho);

	int get_cursor();
};

class ArchivoDeTexto : public ArchivoBase{
public:
	ArchivoDeTexto();
	ArchivoDeTexto(string path, MODOAPERTURA  modo);
	static bool existe(string filename);
	virtual ~ArchivoDeTexto();
};

class ArchivoBinario : public ArchivoBase{
public:
	ArchivoBinario();
	ArchivoBinario(string path, MODOAPERTURA  modo);
	static bool existe(string filename);
	static void crear(string filename);
	static long get_tamanio(string filename);
	static string read(string filename, int posicion_inicio, int size);
	static void writecur(string filename, string data);
	static void writeapp(string filename, string data);
	static void writepos(string filename, int pos, string data);




	void write(string cadena);
	void writeen(string cadena, int position);
	void writeapp(string cadena);
	string read(int pos, size_t tam);
	virtual ~ArchivoBinario();
};

} /* namespace archivosmanager */
#endif /* ARCHIVOSMANAGER_H_ */
